package leetcode;

import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 * description:
 * author:张腾
 * date:2021-06-14
 */

/**
 * 给你一个整数数组 nums ，数组中的元素 互不相同 。返回该数组所有可能的子集（幂集）。
 *
 * 解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。
 */
public class leetcode78 {

    List<List<Integer>> res = new ArrayList<>();
    public List<List<Integer>> subsets(int[] nums) {

        ArrayDeque<Integer> path = new ArrayDeque<>();
        res.add(new ArrayList<>());
        if (nums.length==0 || nums==null){
            return new ArrayList<>();
        }
        for (int i=1;i < nums.length;i++){
            resBack(nums,0,path,i,0);
        }
        ArrayList<Integer> list = new ArrayList<>();
        for (int num : nums) {
            list.add(num);
        }
        res.add(list);
        return res;
    }

    public void resBack(int[] nums,int index,ArrayDeque<Integer> path,int length,int depth){
        if (depth==length){
            res.add(new ArrayList<>(path));
            return;
        }
        if (((nums.length-index) < length-depth)) {
            return;
        }
        for (int i = index;i < nums.length;i++){
            path.add(nums[i]);
            resBack(nums,i+1,path,length,depth+1);
            path.removeLast();
        }
    }
}
